package main

import (
	"fmt"
	"os"
	"time"
)

// 定时执行任务
func doRunning(messageChan chan int) {
	//  创建并启动定时器，每秒钟执行一次
	c := time.Tick(1 * time.Second)

	for {
		// select用于判断channel操作。当某个case中的通道读取成功时，将执行对应的分支代码
		select {
		case <-messageChan:
			fmt.Println("收到外部信号，停止执行")
			return

		// 若所有case中的通道操作均被阻塞，则执行默认操作。
		// 此处，从定时器的channel中读取时间信息，并打印到控制台
		default:
			runningTime := <-c
			fmt.Printf("定时器任务，执行时间：%v\n", runningTime)
		}
	}

}

// 取消执行
func cancelRunning(messageChan chan int) {
	// 初始状态为阻塞，直至从标准输入（默认为键盘）中获取到数据，一旦有输入将结束当前阻塞状态。
	os.Stdin.Read(make([]byte, 1))

	// 向messageChan中写入1。
	messageChan <- 1
}

func main17() {
	// 创建一个channel，用于存储消息
	messageChan := make(chan int)

	// 分别利用子协程，执行doRunning和cancelRunning函数，并将messageChan作为函数参数
	go doRunning(messageChan)
	go cancelRunning(messageChan)

	// select会阻塞执行，无论从哪个channel中读取到数据，都将解除阻塞状态
	time.Sleep(100 * time.Second)
}
